package com.example.service.impl;

import com.example.mapper.operateGuideBookMapp;
import com.example.pojo.changeModelPojo;
import com.example.pojo.operateGuideBookPojo;
import com.example.service.operateGuideBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * ClassName:operateGuideBookImpl
 * Description:
 *
 * @Author 赵永峰
 * @Create 2024/7/19 23:19
 * @Version 1.0
 */
@Service
@Slf4j
public class operateGuideBookImpl implements operateGuideBookService {
    @Autowired
    private operateGuideBookMapp operateGuideBookMapp;
    @Value("${file.upload-dir}")
    private String saveDir;
    //插入一行全新的数据
    public void interOperateGuideBook(operateGuideBookPojo operateGuideBook){
        //组合时间
        operateGuideBook.setEstablishTime(LocalDateTime.now());
        operateGuideBook.setUpdateTime(LocalDateTime.now());
        //写入数据
        operateGuideBookMapp.interOne(operateGuideBook);
    }
    //编辑一行数据，是表头数据
    public void editOperateGuideBookTable(operateGuideBookPojo operateGuideBook){
        operateGuideBookMapp.editChangeModelTable(operateGuideBook);
    }
    //删除一行数据，删除的事表头数据,修改的是int形式的数据
    public void editFieldInt(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        int fieldVal=(int) parameters.get("fieldVal");
        operateGuideBookMapp.editFielDInt(id,fieldName,fieldVal);
    }
    //将符合条件的所有数据查出来，是按照作业指导书的类别查询的。
    public List<operateGuideBookPojo> inquiryByOneField(Map<String, Object> map){
        String firstFiledName=(String) map.get("firstFiledName");
        String secondFiledName=(String) map.get("secondFiledName");
        String thirdFiledName=(String) map.get("thirdFiledName");
        String firstFiledVal=(String) map.get("firstFiledVal");
        String secondFiledVal=(String) map.get("secondFiledVal");
        String thirdFiledVal=(String) map.get("thirdFiledVal");
        List<operateGuideBookPojo> operateGuideBookPojoList=operateGuideBookMapp.inquiryByThreeField(firstFiledName,secondFiledName,thirdFiledName,firstFiledVal,secondFiledVal,thirdFiledVal);
        return operateGuideBookPojoList;
    }
    //编辑作业指导书的内容,修改文本类型
    public String editOperateField(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        String fieldVal=(String) parameters.get("fieldVal");
        String fieldValOld=(String) parameters.get("fieldValOld");
        String editUseName=(String) parameters.get("editUseName") ;
        //组合修改日期
        LocalDateTime Update=LocalDateTime.now();
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter formatterDay = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 将LocalDateTime转换为字符串
        String formattedDateTime = Update.format(formatter);
        String formattedDate = Update.format(formatterDay);
        //组合修改数据
        String editRecord=fieldValOld+"修改日期："+formattedDateTime+";"+"修改人："+editUseName+";";
        operateGuideBookMapp.editChangeModelField(id,fieldName,fieldVal,editRecord,Update);
        return fieldVal;
    }
    //上传文件附件的函数
    public String addPictureOperateGuideBook(MultipartFile file, Integer id, String fieldName, String fieldVal, String fileName){
        try {
            if (!file.isEmpty()) {
                String filePath = saveDir + fileName;
                File dest = new File(filePath);
                // 将文件保存到服务器上的指定位置
                file.transferTo(dest);
                // 将新的作业指导书内容写入到数据库中
                LocalDateTime dateTime = LocalDateTime.now();
                //根据传来的作业指导书内容，写入到数据库中
                operateGuideBookMapp.editFieldOneById(id, fieldName, fieldVal, dateTime);
            }
        }
        catch (IOException e) {
            // 捕获异常并返回错误消息
            throw new RuntimeException("文件保存失败：" + e.getMessage());
        }
        return fieldVal;
    }
    //删除图片的函数
    public String operateGuideBookPictureRemove(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        String filedVal=(String) parameters.get("filedVal");
        String pictureName=(String) parameters.get("pictureName");
        //删除文件
        String filePath =saveDir+pictureName; // 替换为你的文件路径
        // 使用 Paths 类的静态方法 get 来根据给定的文件路径字符串 filePath 创建一个 Path 对象
        Path path = Paths.get(filePath);
        try {
            //先把数据库的信息修改掉
            LocalDateTime dateTime = LocalDateTime.now();
            //修改数据库
            // 将数据写入到数据库中
            operateGuideBookMapp.editFieldOneById(id, fieldName, filedVal, dateTime);
            // 使用 Files 类的 delete 方法删除指定的文件
            Files.delete(path);
            return filedVal;
        }
        catch (IOException e) {
            System.err.println("删除文件时出错: " + e.getMessage());
            return "删除文件时出错";
        }
    }
    //下载文件
    public byte[] readFile(String fileName){
        File file = new File(saveDir + fileName);
        // 检查文件是否存在且可读
        if (file.exists() && file.canRead()) {
            try (FileInputStream fis = new FileInputStream(file)) {
                // 读取文件内容到byte[]数组中
                byte[] fileContent = fis.readAllBytes();
                return fileContent; // 返回文件内容的byte[]数组
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 如果文件不存在或不可读，或者读取时发生异常，返回null
        System.out.println("文件不存在或不可读：" + file.getAbsolutePath());
        return null;
    }
    //根据一个id，编辑一个字段，不需要写整行的编辑时间
    public void editOneFiledById(Map<String, Object> map){
        Integer id=(Integer) map.get("id");
        String filedName=(String) map.get("filedName");
        String filedVal=(String) map.get("filedVal");
        operateGuideBookMapp.editOneFiledById(id,filedName,filedVal);
    }
    //去查询所有的数据
    public List<operateGuideBookPojo> inquiryGuideBookAll(){
        List<operateGuideBookPojo> pojos = operateGuideBookMapp.inquiryGuideBookAll();
        return pojos;
    }
}
